package com.wlz.consumer.consumer;

import com.wlz.api.DemoService;
import lombok.extern.slf4j.Slf4j;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.ConfigurableApplicationContext;

/**
 *  集群容错
 *    1.Failover Cluster     失败自动切换，当出现失败，重试其它服务器 (failover)
 *    2.Failfast Cluster     快速失败，只发起一次调用，失败立即报错。 (failfast)
 *    3. Failsafe Cluster    失败安全，出现异常时，直接忽略。通常用于写入审计日志等操作。  (failsafe)
 *    4. Failback Cluster    失败自动恢复，后台记录失败请求，定时重发。通常用于消息通知操作。 (failback)
 *    5. Forking Cluster     并行调用多个服务器，只要一个成功即返回。   (forking)
 *    6. Broadcast Cluster   广播调用所有提供者，逐个调用，任意一台报错则报错。 (broadcast)
 * @author wlz
 * @date 2022-07-12  10:35 下午
 */
@Slf4j
@EnableAutoConfiguration
public class ClusterDubboConsumerDemo {

    @Reference(version = "timeout", timeout = 3000, cluster = "broadcast")
    private DemoService demoService;

    public static void main(String[] args) {
        ConfigurableApplicationContext context = SpringApplication.run(ClusterDubboConsumerDemo.class, args);

        DemoService demoService = context.getBean(DemoService.class);

        // 服务调用超时时间为1秒，默认为3秒
        // 如果这1秒内没有收到服务结果，则会报错
        String result = demoService.sayHello("wlz timeout ...");
        log.info("result:  {}", result);
    }
}
